package com.huashi.dealer.core.util;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.huashi.dealer.commonEntity.User;

import com.huashi.dealer.core.exception.ServiceException;
import com.huashi.dealer.core.util.SaTokenUtil;
import com.huashi.dealer.modular.business.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Token验证工具类
 * 用于处理Sa-Token验证逻辑（Redis版本）
 *
 * @author 系统生成
 * @since 2025-01-27
 */
@Component
public class TokenUtil {

    @Autowired
    private UserService userService;

    /**
     * 根据token获取用户信息
     *
     * @param token token值
     * @return 用户信息，如果token无效返回null
     */
    public User getUserByToken(String token) {
        if (StrUtil.isBlank(token)) {
            return null;
        }
        
        try {
            // 临时切换到指定token
            String originalToken = StpUtil.getTokenValue();
            StpUtil.switchTo(token);
            
            // 检查token是否有效
            if (!StpUtil.isLogin()) {
                return null;
            }
            
            // 从Sa-Token会话中获取用户信息
            Object userInfo = StpUtil.getSession().get("userInfo");
            if (userInfo instanceof User) {
                // 切换回原始token
                if (originalToken != null) {
                    StpUtil.switchTo(originalToken);
                }
                return (User) userInfo;
            }
            
            // 如果会话中没有用户信息，从数据库获取
            Long userId = SaTokenUtil.getLoginId();

            // 切换回原始token
            if (originalToken != null) {
                StpUtil.switchTo(originalToken);
            }
            
            // 根据用户ID从数据库获取完整用户信息
            return userService.getById(userId);
            
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 验证token是否有效
     *
     * @param token token值
     * @return 是否有效
     */
    public boolean isValidToken(String token) {
        if (StrUtil.isBlank(token)) {
            return false;
        }
        
        try {
            // 临时切换到指定token
            String originalToken = StpUtil.getTokenValue();
            StpUtil.switchTo(token);
            
            // 检查token是否有效
            boolean isValid = StpUtil.isLogin();
            
            // 切换回原始token
            if (originalToken != null) {
                StpUtil.switchTo(originalToken);
            }
            
            return isValid;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 根据token获取用户ID
     *
     * @param token token值
     * @return 用户ID，如果token无效返回null
     */
    public Long getUserIdByToken(String token) {
        if (StrUtil.isBlank(token)) {
            return null;
        }
        
        try {
            // 临时切换到指定token
            String originalToken = StpUtil.getTokenValue();
            StpUtil.switchTo(token);
            
            // 检查token是否有效
            if (!StpUtil.isLogin()) {
                return null;
            }
            
            // 获取用户ID
            Long userId = SaTokenUtil.getLoginId();

            // 切换回原始token
            if (originalToken != null) {
                StpUtil.switchTo(originalToken);
            }
            
            return userId;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 验证token并获取用户信息，如果无效则抛出异常
     *
     * @param token token值
     * @return 用户信息
     * @throws RuntimeException 如果token无效
     */
    public User validateToken(String token) {
        User user = getUserByToken(token);
        if (user == null) {
            throw new ServiceException(401,"Token无效或已过期");
        }
        return user;
    }
} 